home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / BlitzC2P / c2pGeneric.ascii < prev    next >
Text File  |  1998-07-30  |  8KB  |  497 lines

  1. WBStartup
  2. NoCli
  3.  
  4. ; 030/50 results:
  5.  
  6. ; 320x200 @40.1fps
  7. ; 320x256 @30.7fps
  8.  
  9. ; 040/25 results:
  10.  
  11. ; 320x200 @42fps DoublePAL or 44fps PAL
  12. ; 320x256 @31fps DoublePAL or 34fps PAL
  13. ; 320x240 @33.7fps DoublePAL or 36.5fps PAL
  14.  
  15. #c2pBPLX=320
  16. #c2pBPLY=256
  17. #c2pBPLSIZE=(#c2pBPLX*#c2pBPLY)/8
  18.  
  19. #scrwidth=#c2pBPLX
  20. #scrheight=#c2pBPLY
  21. #screensize=#scrwidth*#scrheight
  22.  
  23. ; 060 friendly version
  24. ;       modulo  max res fscreen compu
  25. ; c2p1x1_8_c5     no  320x256?  no  030
  26.  
  27. Statement c2pGenericInit{A.l,B.l}
  28.  
  29.   ;A.l=d0=Width.w
  30.   ;B.l=d1=Height.w
  31.  
  32. ; d0.w  chunkyx [chunky-pixels]
  33. ; d1.w  chunkyy [chunky-pixels]
  34. ; d3.w  scroffsy [screen-pixels]
  35.  
  36.   MOVEQ.l #0,d3 ; Y offset
  37.  
  38. c2p1x1_8_c5_init
  39.   LEA c2p_datanew(pc),a0
  40.   ANDI.l  #$ffff,d0
  41.   MULU.w  d0,d3
  42.   LSR.l #3,d3
  43.   MOVE.l  d3,c2p_scroffs-c2p_data(a0)
  44.   MULU.w  d0,d1
  45.   MOVE.l  d1,c2p_pixels-c2p_data(a0)
  46. AsmExit
  47. End Statement
  48.  
  49. Statement c2pGeneric{A.l,B.l}
  50.  
  51.   MOVE.l  d0,a0 ; Chunky
  52.   MOVE.l  d1,a1 ; Planar
  53.  
  54. ; a0  c2pscreen
  55. ; a1  bitplanes
  56.  
  57. c2p1x1_8_c5
  58.   MOVEM.l a3-a6,-(a7)
  59.  
  60.   MOVEM.l a0-a1,-(a7)
  61.   LEA c2p_datanew,a0
  62.   LEA c2p_data,a1
  63.   MOVEQ #16-1,d0
  64. _c2pcopy: MOVE.l  (a0)+,(a1)+
  65.   DBF d0,_c2pcopy
  66.   MOVEM.l (a7)+,a0-a1
  67.  
  68.   LEA c2p_data(pc),a2
  69.  
  70.   MOVE.l  #$33333333,d5
  71.   MOVE.l  #$55555555,a6
  72.  
  73.   ADD.w #c2pBPLSIZE,a1
  74.   ADD.l c2p_scroffs-c2p_data(a2),a1
  75.  
  76.   MOVE.l  c2p_pixels-c2p_data(a2),a2
  77.   ADD.l a0,a2
  78.   CMP.l a0,a2
  79.   BEQ _none
  80.  
  81.   MOVEM.l a0-a1,-(a7)
  82.  
  83.   MOVE.l  (a0)+,d0
  84.   MOVE.l  (a0)+,d2
  85.   MOVE.l  (a0)+,d1
  86.   MOVE.l  (a0)+,d3
  87.  
  88.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  89.   AND.l d4,d0
  90.   AND.l d4,d1
  91.   AND.l d4,d2
  92.   AND.l d4,d3
  93.   LSL.l #4,d0
  94.   LSL.l #4,d1
  95.   OR.l  d2,d0
  96.   OR.l  d3,d1
  97.  
  98.   MOVE.l  (a0)+,d2
  99.   MOVE.l  (a0)+,d6
  100.   MOVE.l  (a0)+,d3
  101.   MOVE.l  (a0)+,d7
  102.  
  103.   AND.l d4,d2     ; Merge 4x1, part 2
  104.   AND.l d4,d6
  105.   AND.l d4,d3
  106.   AND.l d4,d7
  107.   LSL.l #4,d2
  108.   LSL.l #4,d3
  109.   OR.l  d6,d2
  110.   OR.l  d7,d3
  111.  
  112.   MOVE.w  d2,d6     ; Swap 16x2
  113.   MOVE.w  d3,d7
  114.   MOVE.w  d0,d2
  115.   MOVE.w  d1,d3
  116.   SWAP  d2
  117.   SWAP  d3
  118.   MOVE.w  d2,d0
  119.   MOVE.w  d3,d1
  120.   MOVE.w  d6,d2
  121.   MOVE.w  d7,d3
  122.  
  123.   MOVE.l  d2,d6     ; Swap 2x2
  124.   MOVE.l  d3,d7
  125.   LSR.l #2,d6
  126.   LSR.l #2,d7
  127.   EOR.l d0,d6
  128.   EOR.l d1,d7
  129.   AND.l d5,d6
  130.   AND.l d5,d7
  131.   EOR.l d6,d0
  132.   EOR.l d7,d1
  133.   LSL.l #2,d6
  134.   LSL.l #2,d7
  135.   EOR.l d6,d2
  136.   EOR.l d7,d3
  137.  
  138.   MOVE.l  #$00ff00ff,d4
  139.   MOVE.l  d1,d6     ; Swap 8x1
  140.   MOVE.l  d3,d7
  141.   LSR.l #8,d6
  142.   LSR.l #8,d7
  143.   EOR.l d0,d6
  144.   EOR.l d2,d7
  145.   BRA _start1
  146. _x1
  147.   MOVE.l  (a0)+,d0
  148.   MOVE.l  (a0)+,d2
  149.   MOVE.l  (a0)+,d1
  150.   MOVE.l  (a0)+,d3
  151.   MOVE.l  d7,-c2pBPLSIZE(a1)
  152.  
  153.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  154.   AND.l d4,d0
  155.   AND.l d4,d1
  156.   AND.l d4,d2
  157.   AND.l d4,d3
  158.   LSL.l #4,d0
  159.   LSL.l #4,d1
  160.   OR.l  d2,d0
  161.   OR.l  d3,d1
  162.  
  163.   MOVE.l  (a0)+,d2
  164.   MOVE.l  (a0)+,d6
  165.   MOVE.l  (a0)+,d3
  166.   MOVE.l  (a0)+,d7
  167.   MOVE.l  a3,c2pBPLSIZE(a1)
  168.  
  169.   AND.l d4,d2     ; Merge 4x1, part 2
  170.   AND.l d4,d6
  171.   AND.l d4,d3
  172.   AND.l d4,d7
  173.   LSL.l #4,d2
  174.   LSL.l #4,d3
  175.   OR.l  d6,d2
  176.   OR.l  d7,d3
  177.  
  178.   MOVE.w  d2,d6     ; Swap 16x2
  179.   MOVE.w  d3,d7
  180.   MOVE.w  d0,d2
  181.   MOVE.w  d1,d3
  182.   SWAP  d2
  183.   SWAP  d3
  184.   MOVE.w  d2,d0
  185.   MOVE.w  d3,d1
  186.   MOVE.w  d6,d2
  187.   MOVE.w  d7,d3
  188.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  189.  
  190.   MOVE.l  d2,d6     ; Swap 2x2
  191.   MOVE.l  d3,d7
  192.   LSR.l #2,d6
  193.   LSR.l #2,d7
  194.   EOR.l d0,d6
  195.   EOR.l d1,d7
  196.   AND.l d5,d6
  197.   AND.l d5,d7
  198.   EOR.l d6,d0
  199.   EOR.l d7,d1
  200.   LSL.l #2,d6
  201.   LSL.l #2,d7
  202.   EOR.l d6,d2
  203.   EOR.l d7,d3
  204.  
  205.   MOVE.l  #$00ff00ff,d4
  206.   MOVE.l  d1,d6     ; Swap 8x1
  207.   MOVE.l  d3,d7
  208.   LSR.l #8,d6
  209.   LSR.l #8,d7
  210.   EOR.l d0,d6
  211.   EOR.l d2,d7
  212.   MOVE.l  a5,(a1)+
  213. _start1
  214.   AND.l d4,d6
  215.   AND.l d4,d7
  216.   EOR.l d6,d0
  217.   EOR.l d7,d2
  218.   LSL.l #8,d6
  219.   LSL.l #8,d7
  220.   EOR.l d6,d1
  221.   EOR.l d7,d3
  222.  
  223.   MOVE.l  a6,d4
  224.   MOVE.l  d1,d6     ; Swap 1x1
  225.   MOVE.l  d3,d7
  226.   LSR.l #1,d6
  227.   LSR.l #1,d7
  228.   EOR.l d0,d6
  229.   EOR.l d2,d7
  230.   AND.l d4,d6
  231.   AND.l d4,d7
  232.   EOR.l d6,d0
  233.   EOR.l d7,d2
  234.   ADD.l d6,d6
  235.   ADD.l d7,d7
  236.   EOR.l d1,d6
  237.   EOR.l d3,d7
  238.  
  239.   MOVE.l  d0,a4
  240.   MOVE.l  d2,a5
  241.   MOVE.l  d6,a3
  242.  
  243.   CMPA.l  a0,a2
  244.   BNE _x1
  245.   MOVE.l  d7,-c2pBPLSIZE(a1)
  246.   MOVE.l  a3,c2pBPLSIZE(a1)
  247.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  248.   MOVE.l  a5,(a1)+
  249.  
  250.   MOVEM.l (a7)+,a0-a1
  251.   ADD.l #c2pBPLSIZE*4,a1
  252.  
  253.   MOVE.l  (a0)+,d0
  254.   MOVE.l  (a0)+,d2
  255.   MOVE.l  (a0)+,d1
  256.   MOVE.l  (a0)+,d3
  257.  
  258.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  259.   AND.l d4,d0
  260.   AND.l d4,d1
  261.   AND.l d4,d2
  262.   AND.l d4,d3
  263.   LSR.l #4,d2
  264.   LSR.l #4,d3
  265.   OR.l  d2,d0
  266.   OR.l  d3,d1
  267.  
  268.   MOVE.l  (a0)+,d2
  269.   MOVE.l  (a0)+,d6
  270.   MOVE.l  (a0)+,d3
  271.   MOVE.l  (a0)+,d7
  272.  
  273.   AND.l d4,d2     ; Merge 4x1, part 2
  274.   AND.l d4,d6
  275.   AND.l d4,d3
  276.   AND.l d4,d7
  277.   LSR.l #4,d6
  278.   LSR.l #4,d7
  279.   OR.l  d6,d2
  280.   OR.l  d7,d3
  281.  
  282.   MOVE.w  d2,d6     ; Swap 16x2
  283.   MOVE.w  d3,d7
  284.   MOVE.w  d0,d2
  285.   MOVE.w  d1,d3
  286.   SWAP  d2
  287.   SWAP  d3
  288.   MOVE.w  d2,d0
  289.   MOVE.w  d3,d1
  290.   MOVE.w  d6,d2
  291.   MOVE.w  d7,d3
  292.  
  293.   MOVE.l  d2,d6     ; Swap 2x2
  294.   MOVE.l  d3,d7
  295.   LSR.l #2,d6
  296.   LSR.l #2,d7
  297.   EOR.l d0,d6
  298.   EOR.l d1,d7
  299.   AND.l d5,d6
  300.   AND.l d5,d7
  301.   EOR.l d6,d0
  302.   EOR.l d7,d1
  303.   LSL.l #2,d6
  304.   LSL.l #2,d7
  305.   EOR.l d6,d2
  306.   EOR.l d7,d3
  307.  
  308.   MOVE.l  #$00ff00ff,d4
  309.   MOVE.l  d1,d6     ; Swap 8x1
  310.   MOVE.l  d3,d7
  311.   LSR.l #8,d6
  312.   LSR.l #8,d7
  313.   EOR.l d0,d6
  314.   EOR.l d2,d7
  315.   BRA _start2
  316. _x2
  317.   MOVE.l  (a0)+,d0
  318.   MOVE.l  (a0)+,d2
  319.   MOVE.l  (a0)+,d1
  320.   MOVE.l  (a0)+,d3
  321.   MOVE.l  d7,-c2pBPLSIZE(a1)
  322.  
  323.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  324.   AND.l d4,d0
  325.   AND.l d4,d1
  326.   AND.l d4,d2
  327.   AND.l d4,d3
  328.   LSR.l #4,d2
  329.   LSR.l #4,d3
  330.   OR.l  d2,d0
  331.   OR.l  d3,d1
  332.  
  333.   MOVE.l  (a0)+,d2
  334.   MOVE.l  (a0)+,d6
  335.   MOVE.l  (a0)+,d3
  336.   MOVE.l  (a0)+,d7
  337.   MOVE.l  a3,c2pBPLSIZE(a1)
  338.  
  339.   AND.l d4,d2     ; Merge 4x1, part 2
  340.   AND.l d4,d6
  341.   AND.l d4,d3
  342.   AND.l d4,d7
  343.   LSR.l #4,d6
  344.   LSR.l #4,d7
  345.   OR.l  d6,d2
  346.   OR.l  d7,d3
  347.  
  348.   MOVE.w  d2,d6     ; Swap 16x2
  349.   MOVE.w  d3,d7
  350.   MOVE.w  d0,d2
  351.   MOVE.w  d1,d3
  352.   SWAP  d2
  353.   SWAP  d3
  354.   MOVE.w  d2,d0
  355.   MOVE.w  d3,d1
  356.   MOVE.w  d6,d2
  357.   MOVE.w  d7,d3
  358.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  359.  
  360.   MOVE.l  d2,d6     ; Swap 2x2
  361.   MOVE.l  d3,d7
  362.   LSR.l #2,d6
  363.   LSR.l #2,d7
  364.   EOR.l d0,d6
  365.   EOR.l d1,d7
  366.   AND.l d5,d6
  367.   AND.l d5,d7
  368.   EOR.l d6,d0
  369.   EOR.l d7,d1
  370.   LSL.l #2,d6
  371.   LSL.l #2,d7
  372.   EOR.l d6,d2
  373.   EOR.l d7,d3
  374.  
  375.   MOVE.l  #$00ff00ff,d4
  376.   MOVE.l  d1,d6     ; Swap 8x1
  377.   MOVE.l  d3,d7
  378.   LSR.l #8,d6
  379.   LSR.l #8,d7
  380.   EOR.l d0,d6
  381.   EOR.l d2,d7
  382.   MOVE.l  a5,(a1)+
  383. _start2
  384.   AND.l d4,d6
  385.   AND.l d4,d7
  386.   EOR.l d6,d0
  387.   EOR.l d7,d2
  388.   LSL.l #8,d6
  389.   LSL.l #8,d7
  390.   EOR.l d6,d1
  391.   EOR.l d7,d3
  392.  
  393.   MOVE.l  a6,d4
  394.   MOVE.l  d1,d6     ; Swap 1x1
  395.   MOVE.l  d3,d7
  396.   LSR.l #1,d6
  397.   LSR.l #1,d7
  398.   EOR.l d0,d6
  399.   EOR.l d2,d7
  400.   AND.l d4,d6
  401.   AND.l d4,d7
  402.   EOR.l d6,d0
  403.   EOR.l d7,d2
  404.   ADD.l d6,d6
  405.   ADD.l d7,d7
  406.   EOR.l d1,d6
  407.   EOR.l d3,d7
  408.  
  409.   MOVE.l  d0,a4
  410.   MOVE.l  d2,a5
  411.   MOVE.l  d6,a3
  412.  
  413.   CMPA.l  a0,a2
  414.   BNE _x2
  415.   MOVE.l  d7,-c2pBPLSIZE(a1)
  416.   MOVE.l  a3,c2pBPLSIZE(a1)
  417.   MOVE.l  a4,c2pBPLSIZE*2(a1)
  418.   MOVE.l  a5,(a1)+
  419.  
  420. _none
  421.   MOVEM.l (a7)+,a3-a6
  422.   AsmExit
  423.  
  424.   Even4
  425. c2p_data
  426. c2p_screen: Dc.l 0
  427. c2p_scroffs: Dc.l 0
  428. c2p_scroffs2: Dc.l 0
  429. c2p_c2pBPLSIZE: Dc.l 0
  430. c2p_pixels: Dc.l 0
  431. c2p_pixels2: Dc.l 0
  432. c2p_pixels4: Dc.l 0
  433. c2p_pixels8: Dc.l 0
  434. c2p_pixels16: Dc.l 0
  435. c2p_chunkyx16: Dc.w 0
  436. c2p_chunkyx32: Dc.w 0
  437. c2p_chunkyy: Dc.w 0
  438. c2p_rowmod: Dc.w 0
  439.   Ds.l  16
  440.   Even4
  441. c2p_datanew
  442.   Ds.l  16
  443. End Statement
  444.  
  445.  
  446.  
  447. .blitzprogram
  448. ; Setup
  449. InitBank 0,(#scrwidth*#scrheight)+1000,2|65536 ; Chipram planar buffer
  450. CludgeBitMap 0,#scrwidth,#scrheight,8,Bank(0)
  451. InitPalette 0,256
  452. For c=0 To 255
  453.   AGAPalRGB 0,c,Rnd(c),Rnd(c),Rnd(c)
  454. Next c
  455. AGAPalRGB 0,0,0,0,0
  456. Screen 0,0,0,#scrwidth,#scrheight,8,0,"c2p test",0,0,0
  457. Use Palette 0
  458. VWait 50
  459. baseaddress1.l=AllocMem(#scrwidth*#scrheight,$10000) ; Fastram chunky buffer
  460.  
  461. ; Put something into the chunky buffer so we can see it working
  462. GetReg a0,baseaddress1
  463. MOVE.l  #0,d0
  464. MOVE.l  #screensize-1,d1
  465. cloop
  466.   MOVE.b  d0,(a0)+
  467.   ADDQ.l  #1,d0
  468.   SUBQ.l  #1,d1
  469.   TST.l   d1
  470.   BLT     done
  471.   BRA     cloop
  472. done
  473.  
  474. ; Do the c2p test
  475. c2pGenericInit{#scrwidth,#scrheight}
  476. VWait 20
  477. Forbid_
  478. VWait
  479. ResetTimer
  480. For time=1 To 800
  481.   c2pGeneric{baseaddress1,Bank(0)} ; Convert chunky to planar
  482. Next time
  483. t=Ticks
  484. VWait 2 : Permit_
  485. VWait 20
  486. FindScreen 0
  487. Window 0,0,11,640,100,0,"Test results for c2p",0,0
  488. WindowOutput 0
  489. NPrint "Routine performed @ ",50/(t/800),"fps - ",t," ticks"
  490. NPrint " "
  491. NPrint "Press mousebutton..."
  492. Free Screen 0
  493. MouseWait
  494. Free Window 0
  495. End
  496.  
  497.